/**
 * 案例一：
 * 场景描述:
 * 假设我们有一个在线商店的系统，用户下单后，系统会按以下步骤处理订单：
 *   1. 验证用户的账户是否有效。
 *   2. 检查库存是否充足。
 *   3. 处理支付。
 *   4. 生成订单。
 * 每个步骤都是异步的，并且每一步都依赖于前一步的结果。
 */

// 模拟异步操作的函数
namespace Test {

  function verifyUser(userId: number) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log(`验证用户 ${userId}`);
        if (userId === 1) {
          resolve({ userId, verified: true });
        } else {
          reject('用户验证失败');
        }
      }, 1000);
    });
  }

  function checkInventory(productId: number) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log(`检查库存 产品ID: ${productId}`);
        const inventory = 10; // 模拟库存数量
        if (inventory > 0) {
          resolve({ productId, inStock: true });
        } else {
          reject('库存不足');
        }
      }, 1000);
    });
  }

  function processPayment(userId: number, amount: number) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log(`处理支付 用户ID: ${userId} 支付金额: $${amount}`);
        if (amount > 0) {
          resolve({ userId, amount, paymentStatus: '成功' });
        } else {
          reject('支付失败');
        }
      }, 1000);
    });
  }

  function generateOrder(userId: number, productId: number) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log(`生成订单 用户ID: ${userId} 产品ID: ${productId}`);
        resolve({ orderId: Math.floor(Math.random() * 10000), userId, productId });
      }, 1000);
    });
  }

  // 链式调用实现订单处理流程
  const userId = 1;
  const productId = 101;
  const paymentAmount = 99.99;

  // verifyUser(userId)
  //   .then(user => {
  //     return checkInventory(productId);
  //   })
  //   .then(product => {
  //     return processPayment(userId, paymentAmount);
  //   })
  //   .then(payment => {
  //     return generateOrder(userId, productId);
  //   })
  //   .then(order => {
  //     console.log('订单处理成功:', order);
  //   })
  //   .catch(error => {
  //     console.error('订单处理失败:', error);
  //   });

// 使用 try/catch + async/await语法糖来调用
  async function main() {
    try {
      console.log(await verifyUser(userId));
      console.log(await checkInventory(productId));
      console.log(await processPayment(userId, paymentAmount));
      console.log(await generateOrder(userId, productId));
    } catch (error) {
      console.error('订单处理失败:', error);
    }
  }
  main()
}

// 验证用户 1
// { userId: 1, verified: true }
// 检查库存 产品ID: 101
// { productId: 101, inStock: true }
// 处理支付 用户ID: 1 支付金额: $99.99
// { userId: 1, amount: 99.99, paymentStatus: '成功' }
// 生成订单 用户ID: 1 产品ID: 101
// { orderId: 2770, userId: 1, productId: 101 }